class_name UnitSpawner
extends Node
## 功能：在按照优先级排列的 PlayArea 中生成 Unit。
## 使用：挂载到 Node 节点上，配置 play_areas 导出变量。
## 依赖：PlayArea。

signal on_unit_spawned(unit: Variant)

## 所有可以生成单位的网格单元，数组中靠前的游戏区域生成的优先级更高
@export var play_areas: Array[PlayArea]

const units: Array = [
	# preload("res://scenes/characters/homeless.tscn"),
]


func spawn_unit() -> void:
	var play_area := _get_first_available_play_area()
	if not play_area:
		Logger.fatal("No more empty cells to set this unit.")
	
	var unit = units.pick_random().instantiate()
	if not play_area.add_unit_to_first_empty_cell(unit):
		Logger.fatal("Unable to set unit to empty cell.")
	
	on_unit_spawned.emit(unit)


func _get_first_available_play_area() -> PlayArea:
	for play_area: PlayArea in play_areas:
		if play_area.unit_grid.has_empty_cell():
			return play_area
	return null
